Load libraries, functions and data

|--------------------------------------------------|
|==================================================|
'select()' returned 1:many mapping between keys and columns
'select()' returned 1:many mapping between keys and columns
'select()' returned many:many mapping between keys and columns

#QC

read.depth.plots(rnaseq$meta)

Slightly higher mouse fraction than normal, but overall, this is damn near perfect.

PCAs

pca <- pca.run(rnaseq$human)
pca <- cbind(rnaseq$meta,pca)
plts <- list(
  ggpairs(pca, columns=c('PC1', 'PC2', 'PC3', "human.library.size"),mapping=aes(col=Treatment.arm), upper=list(continuous='cor')),
  ggpairs(pca, columns=c('PC1', 'PC2', 'PC3', "human.library.size"),mapping=aes(col=Group), upper=list(continuous='cor'))
)
for(p in plts) print(p, progress = F)

The largest differences are between the experimental groups (short treatment, long treatment, & resistant samples), with the application of the drug having a smaller, if any, effect. What do the PCAs look like if we look at each group inidividually? Also what are the outliers for group 1?

plts <- lapply(levels(rnaseq$meta$Group),function(g){
  rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Group == g])
  pca <- pca.run(rnaseq.subset$human)
  pca <- cbind(rnaseq.subset$meta,pca)
  ggpairs(pca, columns=c('PC1', 'PC2', 'PC3', "human.library.size"),mapping=aes(col=Treatment.arm), upper=list(continuous='cor'),title = paste("Group:",g))
})
for(p in plts) print(p, progress = F)

There appears to be an outlier in group 1, which we will identify below. Otherwise, nothing of note, which indicates that there may not be large transcriptomic changes.

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Group == 1])
pca <- pca.run(rnaseq.subset$human)
pca <- cbind(rnaseq.subset$meta,pca)
pca
                  Sample.name      Pool Barcode          Sequence  Flowcell Lane                           fname mouse.library.size human.library.size Group                                             Origin Type.of.material Treatment.arm
1:   HCI011-T1-P01-18.241B-T1 SLX-16182 UDI0065 ACACTAAG-ATCCATAT H23KHBBXY  s_4 SLX-16182.UDI0065.H23KHBBXY.s_4             726453           10740675     1 HCI011-x3 (spare of tumour of HCI011-x2 implanted)          3 doses       vehicle
2: HCI011-T1-P01-18.9413L2-T1 SLX-16182 UDI0066 GTGTCGGA-GCTTGCGC H23KHBBXY  s_4 SLX-16182.UDI0066.H23KHBBXY.s_4             598305            9716980     1                                          HCI011-x2          3 doses       vehicle
3: HCI011-T1-P01-18.9413R1-T1 SLX-16182 UDI0067 TTCCTGTT-AGTATCTT H23KHBBXY  s_4 SLX-16182.UDI0067.H23KHBBXY.s_4             266097           12349091     1                                          HCI011-x2          3 doses       vehicle
4: HCI011-T1-P01-18.9416L2-T1 SLX-16182 UDI0068 CCTTCACC-GACGCTCC H23KHBBXY  s_4 SLX-16182.UDI0068.H23KHBBXY.s_4            1199394           10065053     1                                          HCI011-x2          3 doses       vehicle
5:  HCI011-T1-P01-18.239L1-T1 SLX-16182 UDI0069 GCCACAGG-CATGCCAT H23KHBBXY  s_4 SLX-16182.UDI0069.H23KHBBXY.s_4            1056432            9397878     1 HCI011-x3 (spare of tumour of HCI011-x2 implanted)          3 doses       GDC0032
6:   HCI011-T1-P01-18.242B-T1 SLX-16182 UDI0070 ATTGTGAA-TGCATTGC H23KHBBXY  s_4 SLX-16182.UDI0070.H23KHBBXY.s_4            1184487            9929416     1 HCI011-x3 (spare of tumour of HCI011-x2 implanted)          3 doses       GDC0032
7:  HCI011-T1-P01-18.242L2-T1 SLX-16182 UDI0071 ACTCGTGT-ATTGGAAC H23KHBBXY  s_4 SLX-16182.UDI0071.H23KHBBXY.s_4            1574978           10833734     1 HCI011-x3 (spare of tumour of HCI011-x2 implanted)          3 doses       GDC0032
8:  HCI011-T1-P01-18.242NM-T1 SLX-16182 UDI0072 GTCTACAC-GCCAAGGT H23KHBBXY  s_4 SLX-16182.UDI0072.H23KHBBXY.s_4             833155           10428969     1 HCI011-x3 (spare of tumour of HCI011-x2 implanted)          3 doses       GDC0032
   Days.treatment Sensitivity Volume.of.Tumor Cause.of.death        PC1        PC2        PC3        PC4        PC5         PC6        PC7           PC8
1:              4           -             498     end of exp  -4.865990  11.206267  3.3524440 -3.6778368  6.7825653 -2.87223053  5.2110471  2.220446e-16
2:              4           -             695     end of exp  -3.900719   9.939373 14.8538190 -1.3780865 -4.4327113  2.07627946 -1.5520391  6.383782e-16
3:              4           -             540     end of exp  59.960192  -6.246141 -0.9891759  0.2395942 -0.2123211  0.05816152  0.1011068 -2.579881e-14
4:              4           -            1066     end of exp  -8.522011   8.161411 -3.3656177  7.4147375 -5.0739557 -5.75831411  0.8230278  1.600109e-14
5:              4   Sensitive             570     end of exp -17.093052 -37.367157  2.9208371  2.1070527  1.4118816  0.14123286  0.5240586  4.898859e-15
6:              4   Sensitive             464     end of exp -10.586991  -2.650520 -8.1898604 -9.9072927 -4.8273185 -0.14422147 -0.3452060  8.978929e-15
7:              4   Sensitive             648     end of exp  -8.577357   9.543896 -6.0345708  4.6027311  0.4754336  7.33337173  2.3050118  4.662937e-15
8:              4   Sensitive             498     end of exp  -6.414070   7.412872 -2.5478753  0.5991005  5.8764260 -0.83427945 -7.0670070  3.802514e-15
y <- pca.prep(rnaseq.subset$human,T,1000)
y <- prcomp(t(y),scale=T)
summary(y)
Importance of components:
                           PC1     PC2     PC3    PC4     PC5     PC6     PC7      PC8
Standard deviation     24.5698 16.3854 7.19815 5.2726 4.65214 3.78413 3.50308 1.02e-14
Proportion of Variance  0.6037  0.2685 0.05181 0.0278 0.02164 0.01432 0.01227 0.00e+00
Cumulative Proportion   0.6037  0.8721 0.92397 0.9518 0.97341 0.98773 1.00000 1.00e+00

Outlier is “HCI011-T1-P01-18.9413R1-T1” w.r.t to PC1, whose only notable difference is a very low fraction of mouse (~2%).

plts <- lapply(unique(rnaseq$meta$Treatment.arm),function(ta){
  rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Treatment.arm == ta])
  pca <- pca.run(rnaseq.subset$human)
  pca <- cbind(rnaseq.subset$meta,pca)
  ggpairs(pca, columns=c('PC1', 'PC2', 'PC3', "human.library.size"),mapping=aes(col=Group), upper=list(continuous='cor'),title = paste("Treatment arm:",ta))
})
for(p in plts) print(p, progress = F)

~ Treatment

Group 1

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Group == 1])
#rnaseq.subset <- subset.PDX(rnaseq.subset, rnaseq.subset$meta[,Sample.name!="HCI011-T1-P01-18.9413R1-T1"])
treatment <- rnaseq.subset$meta[,factor(Treatment.arm,levels=c("vehicle","GDC0032"))]
d <- model.matrix(~ 0 + treatment)
d
  treatmentvehicle treatmentGDC0032
1                1                0
2                1                0
3                1                0
4                1                0
5                0                1
6                0                1
7                0                1
8                0                1
attr(,"assign")
[1] 1 1
attr(,"contrasts")
attr(,"contrasts")$treatment
[1] "contr.treatment"
cont.matrix <- matrix(c(-1,1), dim(d)[2], 1)
colnames(cont.matrix) <- c("GDC.minus.control")
rownames(cont.matrix) <- colnames(d)
cont.matrix
                 GDC.minus.control
treatmentvehicle                -1
treatmentGDC0032                 1
#Perform DE
DE.data <- DE.run(rnaseq.subset$human,d,cont.matrix = cont.matrix)

#Top DE genes table
DE <- topTable.annotated.DE(DE.data$efit,p.val = 1)
'select()' returned 1:many mapping between keys and columns
if(nrow(DE[adj.P.Val<0.05])!=0){
  DE <- DE[adj.P.Val<0.05]
  table(DE[,direction])
  DE[direction=="up.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
  DE[direction=="down.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
#Pheatmap w/ batch correction
  i <- match(DE$ENSEMBL,rownames(DE.data$v$E))
  y <- removeBatchEffect(DE.data$v$E[i,],design = model.matrix(~drug), batch= pdx)
  labels.col <- rep("",nrow(rnaseq$meta))
  labels.row <- DE$SYMBOL
  ann.col <- as.data.frame(rnaseq$meta[,.(pdx,drug)])
  rownames(ann.col) <- rnaseq$meta[,Sample.name]
  pheatmap(y,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")
} else {
  head(DE,10)
}
            ENSEMBL      logFC  AveExpr         t      P.Value adj.P.Val         B direction ENTREZID    SYMBOL                                              GENENAME
 1: ENSG00000204388  1.0760352 9.253658  4.832736 0.0006147231 0.3272351 -1.519333    up.reg     3304    HSPA1B         heat shock protein family A (Hsp70) member 1B
 2: ENSG00000236675 -0.8133502 5.721730 -4.733665 0.0007165805 0.3272351 -1.574151  down.reg     <NA>      <NA>                                                  <NA>
 3: ENSG00000183011 -0.8991874 6.269441 -4.568031 0.0009288204 0.3272351 -1.620282  down.reg    84316     NAA38 N(alpha)-acetyltransferase 38, NatC auxiliary subunit
 4: ENSG00000145494 -0.7980749 6.345503 -4.512080 0.0010147699 0.3272351 -1.652281  down.reg     4726    NDUFS6             NADH:ubiquinone oxidoreductase subunit S6
 5: ENSG00000237991 -1.0496058 6.159797 -4.452303 0.0011159358 0.3272351 -1.719579  down.reg     <NA>      <NA>                                                  <NA>
 6: ENSG00000151208  1.0660589 5.918073  4.490701 0.0010497920 0.3272351 -1.728342    up.reg     9231      DLG5                  discs large MAGUK scaffold protein 5
 7: ENSG00000077809  0.8711585 6.583563  4.340502 0.0013347542 0.3272351 -1.771400    up.reg     <NA>      <NA>                                                  <NA>
 8: ENSG00000105669 -0.7967949 7.069990 -4.264799 0.0015082447 0.3272351 -1.807395  down.reg    11316      COPE              coatomer protein complex subunit epsilon
 9: ENSG00000125356 -0.6583621 6.864270 -4.197563 0.0016822276 0.3272351 -1.863827  down.reg     4694    NDUFA1             NADH:ubiquinone oxidoreductase subunit A1
10: ENSG00000180389 -0.7912983 6.400057 -4.216161 0.0016320902 0.3272351 -1.873863  down.reg   432369 ATP5F1EP2          ATP synthase F1 subunit epsilon pseudogene 2
#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- merge(y,rnaseq.subset$meta)
ggplot(y) + aes(x=SYMBOL,y=Expression,color=Treatment.arm) + geom_boxplot() + stat_compare_means(aes(label=paste0("p.adj = ",..p.adj..)),method="t.test") + theme_tufte() + theme(legend.position = "top")

## Heatmap
labels.col <- rnaseq.subset$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq.subset$meta[,.(Treatment.arm)])
rownames(ann.col) <- rnaseq.subset$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")

#GSEA
## C6
gsea <- GSEA.run(DE.data$v,d,cont.matrix[,1],Hs.c6,0.05)
'select()' returned 1:many mapping between keys and columns
gsea[Direction=="Up",.(rn,NGenes,Direction,FDR)]
                                  rn NGenes Direction          FDR
 1:                    TGFB_UP.V1_UP    133        Up 5.785652e-05
 2:                    STK33_NOMO_UP    210        Up 2.290397e-04
 3:                         STK33_UP    201        Up 3.175661e-04
 4:                    LTE2_UP.V1_DN    174        Up 3.972324e-04
 5:                     STK33_SKM_UP    192        Up 9.710797e-04
 6:               BCAT_BILD_ET_AL_DN     38        Up 9.766632e-04
 7:                         EIF4E_DN     90        Up 2.000560e-03
 8:                    BMI1_DN.V1_UP    101        Up 2.347305e-03
 9:           BMI1_DN_MEL18_DN.V1_UP     95        Up 2.444336e-03
10:                       TBK1.DF_DN    266        Up 5.350087e-03
11:                    CAMP_UP.V1_DN    155        Up 5.671311e-03
12:               CSR_EARLY_UP.V1_DN    121        Up 6.646370e-03
13:                    PIGF_UP.V1_UP    152        Up 8.964812e-03
14:                    EGFR_UP.V1_UP    168        Up 8.964812e-03
15:                     MEK_UP.V1_DN    172        Up 1.038029e-02
16:                     RAF_UP.V1_DN    177        Up 1.038029e-02
17:                   MEL18_DN.V1_UP     96        Up 1.299166e-02
18:                   RPS14_DN.V1_UP     97        Up 1.354666e-02
19:               PRC2_EZH2_UP.V1_DN    114        Up 1.940560e-02
20:                    PDGF_UP.V1_DN     70        Up 1.940560e-02
21:                PDGF_ERK_DN.V1_DN    130        Up 2.272031e-02
22:                     RAF_UP.V1_UP    167        Up 2.272031e-02
23:                 RB_P130_DN.V1_DN    121        Up 2.272031e-02
24:                    KRAS.DF.V1_DN    129        Up 2.272031e-02
25:             HINATA_NFKB_IMMU_INF      7        Up 2.297676e-02
26:                 MTOR_UP.N4.V1_DN    146        Up 2.652461e-02
27:                    PDGF_UP.V1_UP    127        Up 3.046860e-02
28:                    E2F1_UP.V1_DN    148        Up 3.196333e-02
29:                   HOXA9_DN.V1_UP    148        Up 3.495692e-02
30:                PRC1_BMI_UP.V1_DN     86        Up 3.584935e-02
31:                PRC2_EED_UP.V1_UP    108        Up 3.584935e-02
32:                     ALK_DN.V1_DN     64        Up 4.019820e-02
33:                    RELA_DN.V1_UP     92        Up 4.672090e-02
34:                     MEK_UP.V1_UP    170        Up 4.672090e-02
35:                    IL21_UP.V1_DN     74        Up 4.672090e-02
36:                    ERB2_UP.V1_DN    185        Up 4.672090e-02
37:                     MYC_UP.V1_DN    116        Up 4.672090e-02
38: SINGH_KRAS_DEPENDENCY_SIGNATURE_     18        Up 4.672090e-02
                                  rn NGenes Direction          FDR
gsea[Direction=="Down",.(rn,NGenes,Direction,FDR)]
                  rn NGenes Direction          FDR
1:          EIF4E_UP     77      Down 0.0002290397
2: CSR_LATE_UP.V1_UP    142      Down 0.0002463503
3:  RB_P107_DN.V1_UP    116      Down 0.0002496484
4:  RB_P130_DN.V1_UP    100      Down 0.0194056047
5:      MYC_UP.V1_UP    142      Down 0.0227203071
6:    RPS14_DN.V1_DN    155      Down 0.0236125612

Group 2

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Group == 2])
treatment <- rnaseq.subset$meta[,factor(Treatment.arm,levels=c("vehicle","GDC0032"))]
d <- model.matrix(~ 0 + treatment)
d
  treatmentvehicle treatmentGDC0032
1                1                0
2                1                0
3                1                0
4                0                1
5                0                1
6                0                1
7                0                1
attr(,"assign")
[1] 1 1
attr(,"contrasts")
attr(,"contrasts")$treatment
[1] "contr.treatment"
cont.matrix <- matrix(c(-1,1), dim(d)[2], 1)
colnames(cont.matrix) <- c("GDC.minus.control")
rownames(cont.matrix) <- colnames(d)
cont.matrix
                 GDC.minus.control
treatmentvehicle                -1
treatmentGDC0032                 1
#Perform DE
DE.data <- DE.run(rnaseq.subset$human,d,3,cont.matrix = cont.matrix)

#Top DE genes table
DE <- topTable.annotated.DE(DE.data$efit,p.val = 1)
'select()' returned 1:many mapping between keys and columns
if(nrow(DE[adj.P.Val<0.05])!=0){
  DE <- DE[adj.P.Val<0.05]
  table(DE[,direction])
  DE[direction=="up.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
  DE[direction=="down.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
#Pheatmap w/ batch correction
  i <- match(DE$ENSEMBL,rownames(DE.data$v$E))
  y <- removeBatchEffect(DE.data$v$E[i,],design = model.matrix(~drug), batch= pdx)
  labels.col <- rep("",nrow(rnaseq$meta))
  labels.row <- DE$SYMBOL
  ann.col <- as.data.frame(rnaseq$meta[,.(pdx,drug)])
  rownames(ann.col) <- rnaseq$meta[,Sample.name]
  pheatmap(y,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")
} else {
  print("No DE genes found")
  head(DE,10)
}
[1] "No DE genes found"
            ENSEMBL      logFC  AveExpr         t      P.Value adj.P.Val         B direction ENTREZID  SYMBOL                                                                        GENENAME
 1: ENSG00000174021  1.0508825 6.847082  6.713034 7.674007e-05 0.6224003 -3.671849    up.reg     2787    GNG5                                                       G protein subunit gamma 5
 2: ENSG00000164128 -1.1130122 5.649225 -5.955737 1.919213e-04 0.9268516 -3.790498  down.reg     4886   NPY1R                                                      neuropeptide Y receptor Y1
 3: ENSG00000204569  0.8046126 6.989129  4.701910 1.037803e-03 0.9268516 -3.835360    up.reg     5514 PPP1R10                                     protein phosphatase 1 regulatory subunit 10
 4: ENSG00000164442 -0.9972152 5.227045 -5.581024 3.105660e-04 0.9268516 -3.852576  down.reg    10370  CITED2 Cbp/p300 interacting transactivator with Glu/Asp rich carboxy-terminal domain 2
 5: ENSG00000186918 -0.6304149 5.900330 -4.502097 1.386601e-03 0.9268516 -3.907247  down.reg    55893  ZNF395                                                         zinc finger protein 395
 6: ENSG00000104267 -0.8459846 6.814805 -4.081274 2.600769e-03 0.9268516 -3.919892  down.reg      760     CA2                                                            carbonic anhydrase 2
 7: ENSG00000144802 -1.1270393 5.645451 -4.275787 1.938616e-03 0.9268516 -3.952431  down.reg    64332  NFKBIZ                                                             NFKB inhibitor zeta
 8: ENSG00000074800 -0.4960966 8.821536 -3.652362 5.062147e-03 0.9268516 -3.974104  down.reg     2023    ENO1                                                                       enolase 1
 9: ENSG00000135127  0.8043419 6.155308  3.951610 3.172693e-03 0.9268516 -3.976310    up.reg    92558  BICDL1                                                BICD family like cargo adaptor 1
10: ENSG00000104321 -1.8460421 7.281383 -3.667565 4.942057e-03 0.9268516 -3.983110  down.reg     8989   TRPA1                transient receptor potential cation channel subfamily A member 1
#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- merge(y,rnaseq.subset$meta)
ggplot(y) + aes(x=SYMBOL,y=Expression,color=Treatment.arm) + geom_boxplot() + stat_compare_means(aes(label=paste0("p.adj = ",..p.adj..)),method="t.test") + theme_tufte() + theme(legend.position = "top")

## Heatmap
labels.col <- rnaseq.subset$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq.subset$meta[,.(Treatment.arm)])
rownames(ann.col) <- rnaseq.subset$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")

#GSEA - c6
gsea <- GSEA.run(DE.data$v,d,cont.matrix[,1],Hs.c6,0.05)
'select()' returned 1:many mapping between keys and columns
gsea[Direction=="Up",.(rn,NGenes,Direction,FDR)]
                                  rn NGenes Direction          FDR
 1:          ESC_V6.5_UP_EARLY.V1_DN    116        Up 8.734097e-06
 2:                    BMI1_DN.V1_UP    101        Up 1.146764e-03
 3:           BMI1_DN_MEL18_DN.V1_UP     94        Up 1.299194e-03
 4:                    TGFB_UP.V1_UP    133        Up 3.186118e-03
 5:                KRAS.600_UP.V1_DN    134        Up 3.186118e-03
 6:                    PTEN_DN.V2_UP     78        Up 4.432734e-03
 7:           KRAS.AMP.LUNG_UP.V1_DN     74        Up 5.805192e-03
 8:                KRAS.300_UP.V1_DN     72        Up 8.586000e-03
 9:               KRAS.LUNG_UP.V1_DN     68        Up 1.156810e-02
10:                   MEL18_DN.V1_UP     95        Up 1.211232e-02
11:                    SNF5_DN.V1_DN     92        Up 3.277517e-02
12:             KRAS.KIDNEY_UP.V1_DN     60        Up 3.277517e-02
13:                 CAHOY_ASTROGLIAL     59        Up 3.277517e-02
14:                    RELA_DN.V1_DN     58        Up 3.277517e-02
15:                     MEK_UP.V1_UP    171        Up 3.277517e-02
16:               CYCLIN_D1_UP.V1_UP    127        Up 3.874861e-02
17:           CAHOY_OLIGODENDROCUTIC     69        Up 4.393997e-02
18:                     P53_DN.V1_UP    147        Up 4.393997e-02
19: SINGH_KRAS_DEPENDENCY_SIGNATURE_     18        Up 4.393997e-02
20:              RAPA_EARLY_UP.V1_UP    115        Up 4.393997e-02
21:                     MYC_UP.V1_DN    115        Up 4.589087e-02
22:                  VEGF_A_UP.V1_UP    129        Up 4.589087e-02
23:                     AKT_UP.V1_DN    132        Up 4.589087e-02
                                  rn NGenes Direction          FDR
gsea[Direction=="Down",.(rn,NGenes,Direction,FDR)]
                rn NGenes Direction        FDR
1:  HOXA9_DN.V1_DN    160      Down 0.03277517
2:      TBK1.DF_DN    268      Down 0.03831569
3: VEGF_A_UP.V1_DN    167      Down 0.04466353

Group 3

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Group == 3])
treatment <- rnaseq.subset$meta[,factor(Treatment.arm,levels=c("vehicle","GDC0032"))]
d <- model.matrix(~ 0 + treatment)
d
   treatmentvehicle treatmentGDC0032
1                 1                0
2                 1                0
3                 1                0
4                 1                0
5                 1                0
6                 0                1
7                 0                1
8                 0                1
9                 0                1
10                0                1
11                0                1
12                0                1
13                0                1
attr(,"assign")
[1] 1 1
attr(,"contrasts")
attr(,"contrasts")$treatment
[1] "contr.treatment"
cont.matrix <- matrix(c(-1,1), dim(d)[2], 1)
colnames(cont.matrix) <- c("GDC.minus.control")
rownames(cont.matrix) <- colnames(d)
cont.matrix
                 GDC.minus.control
treatmentvehicle                -1
treatmentGDC0032                 1
#Perform DE
DE.data <- DE.run(rnaseq.subset$human,d,5,cont.matrix = cont.matrix)

#Top DE genes table
DE <- topTable.annotated.DE(DE.data$efit,p.val = 1)
'select()' returned 1:many mapping between keys and columns
if(nrow(DE[adj.P.Val<0.05])!=0){
  DE <- DE[adj.P.Val<0.05]
  table(DE[,direction])
  DE[direction=="up.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
  DE[direction=="down.reg",.(direction,ENSEMBL,SYMBOL,adj.P.Val,logFC)]
#Pheatmap w/ batch correction
  i <- match(DE$ENSEMBL,rownames(DE.data$v$E))
  y <- removeBatchEffect(DE.data$v$E[i,],design = model.matrix(~drug), batch= pdx)
  labels.col <- rep("",nrow(rnaseq$meta))
  labels.row <- DE$SYMBOL
  ann.col <- as.data.frame(rnaseq$meta[,.(pdx,drug)])
  rownames(ann.col) <- rnaseq$meta[,Sample.name]
  pheatmap(y,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")
} else {
  print("No DE genes found")
  head(DE,10)
}
[1] "No DE genes found"
            ENSEMBL      logFC  AveExpr         t      P.Value adj.P.Val           B direction ENTREZID SYMBOL                                                   GENENAME
 1: ENSG00000163995  0.6837759 3.410971  5.496805 3.477881e-05 0.5074877  0.17215334    up.reg    84448 ABLIM2                  actin binding LIM protein family member 2
 2: ENSG00000111300  0.4156489 5.496378  4.531102 2.726366e-04 0.5074877  0.10500080    up.reg    80018  NAA25      N(alpha)-acetyltransferase 25, NatB auxiliary subunit
 3: ENSG00000102753  0.3786802 6.106180  4.424698 3.438274e-04 0.5074877  0.03975911    up.reg     3839  KPNA3                                karyopherin subunit alpha 3
 4: ENSG00000253729  0.4086519 6.749566  4.330204 4.227513e-04 0.5074877 -0.05735691    up.reg     5591  PRKDC       protein kinase, DNA-activated, catalytic polypeptide
 5: ENSG00000204389 -0.5307251 7.717875 -4.208828 5.516668e-04 0.5074877 -0.22188442  down.reg     3303 HSPA1A              heat shock protein family A (Hsp70) member 1A
 6: ENSG00000139055 -0.4244053 5.203128 -4.308408 4.434221e-04 0.5074877 -0.26761439  down.reg   121506  ERP27                           endoplasmic reticulum protein 27
 7: ENSG00000204922 -0.4767766 4.225305 -4.500622 2.913477e-04 0.5074877 -0.27855530  down.reg   790955  UQCC3 ubiquinol-cytochrome c reductase complex assembly factor 3
 8: ENSG00000072501  0.2871578 7.901466  4.138382 6.440253e-04 0.5074877 -0.34573791    up.reg     8243  SMC1A                   structural maintenance of chromosomes 1A
 9: ENSG00000163346 -0.3361114 6.606192 -4.118766 6.724169e-04 0.5074877 -0.41793193  down.reg    57326 PBXIP1                         PBX homeobox interacting protein 1
10: ENSG00000234444  0.4092223 4.950297  4.180120 5.875733e-04 0.5074877 -0.57590263    up.reg   728927 ZNF736                                    zinc finger protein 736
#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- merge(y,rnaseq.subset$meta)
ggplot(y) + aes(x=SYMBOL,y=Expression,color=Treatment.arm) + geom_boxplot() + stat_compare_means(aes(label=paste0("p.adj = ",..p.adj..)),method="t.test") + theme_tufte() + theme(legend.position = "top")

## Heatmap
labels.col <- rnaseq.subset$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq.subset$meta[,.(Treatment.arm)])
rownames(ann.col) <- rnaseq.subset$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")

#GSEA - c6
gsea <- GSEA.run(DE.data$v,d,cont.matrix[,1],Hs.c6,0.05)
'select()' returned 1:many mapping between keys and columns
gsea[Direction=="Up",.(rn,NGenes,Direction,FDR)]
                         rn NGenes Direction          FDR
 1:         VEGF_A_UP.V1_DN    167        Up 2.498761e-05
 2:           ERB2_UP.V1_DN    186        Up 4.565218e-05
 3:              TBK1.DF_DN    267        Up 6.914354e-05
 4:           PIGF_UP.V1_UP    156        Up 5.032092e-04
 5:  GCNP_SHH_UP_LATE.V1_UP    157        Up 1.941501e-03
 6:           E2F1_UP.V1_UP    171        Up 4.030628e-03
 7: GCNP_SHH_UP_EARLY.V1_UP    146        Up 4.030628e-03
 8:          RPS14_DN.V1_DN    154        Up 4.522622e-03
 9:           LTE2_UP.V1_DN    177        Up 6.406573e-03
10:      CSR_EARLY_UP.V1_UP    145        Up 7.089887e-03
11:      BCAT_BILD_ET_AL_DN     38        Up 1.263871e-02
12:      PRC2_EZH2_UP.V1_UP    132        Up 1.722478e-02
gsea[Direction=="Down",.(rn,NGenes,Direction,FDR)]
              rn NGenes Direction         FDR
1: ERB2_UP.V1_UP    174      Down 0.007089887
2:      EIF4E_UP     78      Down 0.027986355

~ Group

Vehicle

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Treatment.arm=="vehicle"])
treatment.group <- rnaseq.subset$meta[,Group]
d <- model.matrix(~ 0 + treatment.group)
d
   treatment.group1 treatment.group2 treatment.group3
1                 1                0                0
2                 1                0                0
3                 1                0                0
4                 1                0                0
5                 0                0                1
6                 0                0                1
7                 0                0                1
8                 0                0                1
9                 0                0                1
10                0                1                0
11                0                1                0
12                0                1                0
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$treatment.group
[1] "contr.treatment"
cont.matrix <- matrix(c(-1,1,0,-1,0,1,0,-1,1), dim(d)[2], 3)
colnames(cont.matrix) <- c("Long.minus.short","Resistant.minus.short","Resistant.minus.long")
rownames(cont.matrix) <- colnames(d)
cont.matrix
                 Long.minus.short Resistant.minus.short Resistant.minus.long
treatment.group1               -1                    -1                    0
treatment.group2                1                     0                   -1
treatment.group3                0                     1                    1
#Perform DE
DE.data <- DE.run(rnaseq.subset$human,d,3,cont.matrix = cont.matrix)

dt <- decideTests(DE.data$efit)
summary(dt)
       Long.minus.short Resistant.minus.short Resistant.minus.long
Down               2243                  2816                    0
NotSig            12186                 11123                16786
Up                 2357                  2847                    0
dt.common <- dt[rowSums(abs(dt))!=0,]
vennDiagram(dt.common)

#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- merge(y,rnaseq.subset$meta)
ggplot(y) + aes(x=SYMBOL,y=Expression,color=Group) + geom_boxplot() + theme_tufte() + theme(legend.position = "top")

## Heatmap
labels.col <- rnaseq.subset$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq.subset$meta[,.(Group)])
rownames(ann.col) <- rnaseq.subset$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")

Drug

rnaseq.subset <- subset.PDX(rnaseq, rnaseq$meta[,Treatment.arm=="GDC0032"])
treatment.group <- rnaseq.subset$meta[,Group]
d <- model.matrix(~ 0 + treatment.group)
d
   treatment.group1 treatment.group2 treatment.group3
1                 1                0                0
2                 1                0                0
3                 1                0                0
4                 1                0                0
5                 0                0                1
6                 0                0                1
7                 0                0                1
8                 0                0                1
9                 0                0                1
10                0                0                1
11                0                0                1
12                0                0                1
13                0                1                0
14                0                1                0
15                0                1                0
16                0                1                0
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$treatment.group
[1] "contr.treatment"
cont.matrix <- matrix(c(-1,1,0,-1,0,1,0,-1,1), dim(d)[2], 3)
colnames(cont.matrix) <- c("Long.minus.short","Resistant.minus.short","Resistant.minus.long")
rownames(cont.matrix) <- colnames(d)
cont.matrix
                 Long.minus.short Resistant.minus.short Resistant.minus.long
treatment.group1               -1                    -1                    0
treatment.group2                1                     0                   -1
treatment.group3                0                     1                    1
#Perform DE
DE.data <- DE.run(rnaseq.subset$human,d,4,cont.matrix = cont.matrix)

dt <- decideTests(DE.data$efit)
summary(dt)
       Long.minus.short Resistant.minus.short Resistant.minus.long
Down                 78                  1791                  514
NotSig            16695                 13186                16005
Up                   15                  1811                  269
dt.common <- dt[rowSums(abs(dt))!=0,]
vennDiagram(dt.common)

#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- merge(y,rnaseq.subset$meta)
ggplot(y) + aes(x=SYMBOL,y=Expression,color=Group) + geom_boxplot() + theme_tufte() + theme(legend.position = "top")

## Heatmap
labels.col <- rnaseq.subset$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq.subset$meta[,.(Group)])
rownames(ann.col) <- rnaseq.subset$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="row")

~ Treatment * Group

treatment.group <- rnaseq$meta[,Group]
treatment <- rnaseq$meta[,factor(Treatment.arm,levels=c("vehicle","GDC0032"))]
d <- model.matrix(~ 0 + treatment.group * treatment)
d
   treatment.group1 treatment.group2 treatment.group3 treatmentGDC0032 treatment.group2:treatmentGDC0032 treatment.group3:treatmentGDC0032
1                 1                0                0                0                                 0                                 0
2                 1                0                0                0                                 0                                 0
3                 1                0                0                0                                 0                                 0
4                 1                0                0                0                                 0                                 0
5                 1                0                0                1                                 0                                 0
6                 1                0                0                1                                 0                                 0
7                 1                0                0                1                                 0                                 0
8                 1                0                0                1                                 0                                 0
9                 0                0                1                0                                 0                                 0
10                0                0                1                0                                 0                                 0
11                0                0                1                0                                 0                                 0
12                0                0                1                0                                 0                                 0
13                0                0                1                0                                 0                                 0
14                0                0                1                1                                 0                                 1
15                0                0                1                1                                 0                                 1
16                0                0                1                1                                 0                                 1
17                0                0                1                1                                 0                                 1
18                0                0                1                1                                 0                                 1
19                0                0                1                1                                 0                                 1
20                0                0                1                1                                 0                                 1
21                0                0                1                1                                 0                                 1
22                0                1                0                0                                 0                                 0
23                0                1                0                0                                 0                                 0
24                0                1                0                0                                 0                                 0
25                0                1                0                1                                 1                                 0
26                0                1                0                1                                 1                                 0
27                0                1                0                1                                 1                                 0
28                0                1                0                1                                 1                                 0
attr(,"assign")
[1] 1 1 1 2 3 3
attr(,"contrasts")
attr(,"contrasts")$treatment.group
[1] "contr.treatment"

attr(,"contrasts")$treatment
[1] "contr.treatment"
DE.data <- DE.run(rnaseq$human,d,coefs = 1:6)

dt <- decideTests(DE.data$efit)
summary(dt)
       treatment.group1 treatment.group2 treatment.group3 treatmentGDC0032 treatment.group2:treatmentGDC0032 treatment.group3:treatmentGDC0032
Down                450              185              519                0                                 1                                 1
NotSig             2351             2773             2253            17381                             17380                             17380
Up                14580            14423            14609                0                                 0                                 0
#Genes of Interest
x <- DE.data$v$E[match(GoI$ENSEMBL,rownames(DE.data$v$E)),]
rownames(x) <- GoI$SYMBOL
## Boxplot
y <- melt(x)
names(y) <- c("SYMBOL","fname","Expression")
y <- data.table(merge(y,rnaseq$meta))
y[,Treatment.arm:=factor(Treatment.arm,levels=c("vehicle","GDC0032"))]
levels(y$Treatment.arm) <- c("Vehicle","GDC0032")
ggplot(y) + aes(x=Treatment.arm,y=Expression,color=Group) + geom_boxplot() + theme_tufte() + theme(legend.position = "top") + facet_wrap(~SYMBOL)

ggplot(y) + aes(x=Group,y=Expression,color=Treatment.arm) + geom_boxplot() + theme_tufte() + theme(legend.position = "top") + facet_wrap(~SYMBOL)

## Heatmap
labels.col <- rnaseq$meta[,Barcode]
labels.row <- GoI$SYMBOL
ann.col <- as.data.frame(rnaseq$meta[,.(Group,Treatment.arm)])
rownames(ann.col) <- rnaseq$meta[,fname]
pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="none")

# Pathways of Interest
plts <- lapply(PoI, function(p){
  x <- DE.data$v$E[match(p$ENSEMBL,rownames(DE.data$v$E)),]
  rownames(x) <- p$SYMBOL
  x <- x[rowSums(is.na(x)) == 0,]
  labels.col <- rnaseq$meta[,Barcode]
  labels.row <- rownames(x)
  ann.col <- as.data.frame(rnaseq$meta[,.(Group,Treatment.arm)])
  rownames(ann.col) <- rnaseq$meta[,fname]
  pheatmap(x,labels_col=labels.col,labels_row=labels.row,annotation_col = ann.col,scale="none")
})

ggplot(y[y$SYMBOL=="LDHA",]) + aes(x=Group,y=Expression,fill=Treatment.arm) + geom_boxplot() + stat_compare_means(label="p.format",method="t.test",method.args = list(alternative = "less"),label.y=9.7) + theme_tufte(12) + theme(legend.position = "top",legend.title=element_blank()) + ylab("LDHA Expression")

ggplot(y[y$SYMBOL=="FOXM1",]) + aes(x=Group,y=Expression,fill=Treatment.arm) + geom_boxplot() + stat_compare_means(label="p.format",method="t.test",method.args = list(alternative = "less"),label.y=9.7) + theme_tufte(12) + theme(legend.position = "top",legend.title=element_blank()) + ylab("FOXM1 Expression")

my_comparisons <- list(c("1","2"),c("2","3"),c("1","3"))
ggplot(y[y$SYMBOL=="FOXM1" & Treatment.arm=="GDC0032",]) + aes(x=Group,y=Expression) + geom_boxplot() + stat_compare_means(label.y=8.5) + stat_compare_means(comparisons = my_comparisons,method.args = list(alternative = "less")) + theme_tufte(12) + theme(legend.position = "top") + ylab("FOXM1 Expression") + xlab("GDC-0032 Treated Group")

z <- merge(data.table(t(x),keep.rownames = "fname"),rnaseq$meta)
ggpairs(z,columns = 2:6)

LS0tCnRpdGxlOiAnUERYOiBEcnVnIHRyYWlscycKYXV0aG9yOiAiQWxpc3RhaXIgTWFydGluIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICJMYXN0IG1vZGlmaWVkOiAlZCAlYiAlWSIpYCcKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKc3VidGl0bGU6IEdEQyAoU3VzYW5hKQpsYXlvdXQ6IHBhZ2UKLS0tCgojIExvYWQgbGlicmFyaWVzLCBmdW5jdGlvbnMgYW5kIGRhdGEKYGBge3IsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBlY2hvPUZ9CnJvb3QuZGlyIDwtICJ+L09uZURyaXZlL3Byb2plY3RzLyIKcHJvamVjdC5kaXIgPC0gcGFzdGUwKHJvb3QuZGlyLCJQRFgvIikKc291cmNlKHBhc3RlMChyb290LmRpciwiUi51dGlscy9STkFTRVEudXRpbHMuUiIpKQpzb3VyY2UocGFzdGUwKHByb2plY3QuZGlyLCJzcmMvbG9hZC5QRFguUiIpKQoKcm5hc2VxIDwtIGdldC5QRFgoKQptZXRhIDwtIGxvYWQubWV0YSgpCm1ldGEgPC0gc3Vic2V0Lm1ldGEobWV0YSxtZXRhWyxwcm9qZWN0PT0iZHJ1Zy5HREMuZXhwMiJdKQpybmFzZXEgPC0gc3Vic2V0LlBEWChybmFzZXEsIHJuYXNlcSRtZXRhWyxTYW1wbGUubmFtZV0gJWluJSBtZXRhWyxTYW1wbGUubmFtZV0pCnJuYXNlcSRtZXRhIDwtIG1lcmdlKHJuYXNlcSRtZXRhLCBtZXRhLHNvcnQ9RikKcm5hc2VxJG1ldGFbLEdyb3VwOj1mYWN0b3IoR3JvdXApXQoKR29JIDwtIGMoIkZPWE0xIiwiRk9YTzMiLCJMREhBIiwiSEsyIiwiUFRFTiIpCkdvSSA8LSBkYXRhLnRhYmxlKHNlbGVjdChvcmcuSHMuZWcuZGIsa2V5cz1Hb0ksa2V5dHlwZSA9ICJTWU1CT0wiLGNvbHVtbnMgPSBjKCJFTlNFTUJMIiwiRU5UUkVaSUQiLCJTWU1CT0wiKSkpCkdvSSA8LSBHb0lbRU5TRU1CTCE9IkVOU0cwMDAwMDI4NDc5MiJdICNyZW1vdmUgcGF0Y2hlZCBQVEVOCgpQb0kgPC0gbGlzdCgKICBQMTNLID0gIkFLVDEgQUtUMiBBS1QzIERFUERDNSBERVBUT1IgSUdGMVIgSU5QUDRCIE1UT1IgTkRSRzEgUERLMSBQSUszQzJCIFBJSzNDQSBQSUszUjEgUFBQMlIxQSBQVEVOIFJIRUIgUklDVE9SIFJQVE9SIFJQUzYgUlBTNktCMSBTVEsxMSBUU0MxIFRTQzIiLCAKICBGT1hNMSA9ICJBUkYgQVVSS0IgQVhJTjIgQkNBVDEgQklSQzUgQlJDQTEgQlJDQTIgQ0FUIENDTkIxIENDTkQxIENESDEgQ0RLTjFBIEZPUyBNWUMgRk9YTzEgRk9YQTEgRk9YQTIgRk9YTzEgR0FUQTMgTkVLMiBNWUNOIENES04yQSBQTEsxIFNPRDIgVEVSVCBUR0ZCMSBLRFIiCikKUG9JIDwtIHNhcHBseShQb0ksIHN0cnNwbGl0LCBzcGxpdD0iICIpClBvSSA8LSBsYXBwbHkoUG9JLCBmdW5jdGlvbih4KSBkYXRhLnRhYmxlKHNlbGVjdChvcmcuSHMuZWcuZGIsa2V5cz14LGtleXR5cGUgPSAiU1lNQk9MIixjb2x1bW5zID0gYygiRU5TRU1CTCIsIkVOVFJFWklEIiwiU1lNQk9MIikpKSkKYGBgCgojUUMKCmBgYHtyfQpyZWFkLmRlcHRoLnBsb3RzKHJuYXNlcSRtZXRhKQpgYGAKCgpTbGlnaHRseSBoaWdoZXIgbW91c2UgZnJhY3Rpb24gdGhhbiBub3JtYWwsIGJ1dCBvdmVyYWxsLCB0aGlzIGlzIGRhbW4gbmVhciBwZXJmZWN0LgoKIyBQQ0FzCgpgYGB7cn0KcGNhIDwtIHBjYS5ydW4ocm5hc2VxJGh1bWFuKQpwY2EgPC0gY2JpbmQocm5hc2VxJG1ldGEscGNhKQpwbHRzIDwtIGxpc3QoCiAgZ2dwYWlycyhwY2EsIGNvbHVtbnM9YygnUEMxJywgJ1BDMicsICdQQzMnLCAiaHVtYW4ubGlicmFyeS5zaXplIiksbWFwcGluZz1hZXMoY29sPVRyZWF0bWVudC5hcm0pLCB1cHBlcj1saXN0KGNvbnRpbnVvdXM9J2NvcicpKSwKICBnZ3BhaXJzKHBjYSwgY29sdW1ucz1jKCdQQzEnLCAnUEMyJywgJ1BDMycsICJodW1hbi5saWJyYXJ5LnNpemUiKSxtYXBwaW5nPWFlcyhjb2w9R3JvdXApLCB1cHBlcj1saXN0KGNvbnRpbnVvdXM9J2NvcicpKQopCmZvcihwIGluIHBsdHMpIHByaW50KHAsIHByb2dyZXNzID0gRikKYGBgCgpUaGUgbGFyZ2VzdCBkaWZmZXJlbmNlcyBhcmUgYmV0d2VlbiB0aGUgZXhwZXJpbWVudGFsIGdyb3VwcyAoc2hvcnQgdHJlYXRtZW50LCBsb25nIHRyZWF0bWVudCwgJiByZXNpc3RhbnQgc2FtcGxlcyksIHdpdGggdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBkcnVnIGhhdmluZyBhIHNtYWxsZXIsIGlmIGFueSwgZWZmZWN0LiBXaGF0IGRvIHRoZSBQQ0FzIGxvb2sgbGlrZSBpZiB3ZSBsb29rIGF0IGVhY2ggZ3JvdXAgaW5pZGl2aWR1YWxseT8gQWxzbyB3aGF0IGFyZSB0aGUgb3V0bGllcnMgZm9yIGdyb3VwIDE/CgpgYGB7cn0KcGx0cyA8LSBsYXBwbHkobGV2ZWxzKHJuYXNlcSRtZXRhJEdyb3VwKSxmdW5jdGlvbihnKXsKICBybmFzZXEuc3Vic2V0IDwtIHN1YnNldC5QRFgocm5hc2VxLCBybmFzZXEkbWV0YVssR3JvdXAgPT0gZ10pCiAgcGNhIDwtIHBjYS5ydW4ocm5hc2VxLnN1YnNldCRodW1hbikKICBwY2EgPC0gY2JpbmQocm5hc2VxLnN1YnNldCRtZXRhLHBjYSkKICBnZ3BhaXJzKHBjYSwgY29sdW1ucz1jKCdQQzEnLCAnUEMyJywgJ1BDMycsICJodW1hbi5saWJyYXJ5LnNpemUiKSxtYXBwaW5nPWFlcyhjb2w9VHJlYXRtZW50LmFybSksIHVwcGVyPWxpc3QoY29udGludW91cz0nY29yJyksdGl0bGUgPSBwYXN0ZSgiR3JvdXA6IixnKSkKfSkKZm9yKHAgaW4gcGx0cykgcHJpbnQocCwgcHJvZ3Jlc3MgPSBGKQpgYGAKClRoZXJlIGFwcGVhcnMgdG8gYmUgYW4gb3V0bGllciBpbiBncm91cCAxLCB3aGljaCB3ZSB3aWxsIGlkZW50aWZ5IGJlbG93LiBPdGhlcndpc2UsIG5vdGhpbmcgb2Ygbm90ZSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlcmUgbWF5IG5vdCBiZSBsYXJnZSB0cmFuc2NyaXB0b21pYyBjaGFuZ2VzLgoKYGBge3J9CnJuYXNlcS5zdWJzZXQgPC0gc3Vic2V0LlBEWChybmFzZXEsIHJuYXNlcSRtZXRhWyxHcm91cCA9PSAxXSkKcGNhIDwtIHBjYS5ydW4ocm5hc2VxLnN1YnNldCRodW1hbikKcGNhIDwtIGNiaW5kKHJuYXNlcS5zdWJzZXQkbWV0YSxwY2EpCnBjYQoKeSA8LSBwY2EucHJlcChybmFzZXEuc3Vic2V0JGh1bWFuLFQsMTAwMCkKeSA8LSBwcmNvbXAodCh5KSxzY2FsZT1UKQpzdW1tYXJ5KHkpCmBgYAoKT3V0bGllciBpcyAiSENJMDExLVQxLVAwMS0xOC45NDEzUjEtVDEiIHcuci50IHRvIFBDMSwgd2hvc2Ugb25seSBub3RhYmxlIGRpZmZlcmVuY2UgaXMgYSB2ZXJ5IGxvdyBmcmFjdGlvbiBvZiBtb3VzZSAofjIlKS4KCmBgYHtyfQpwbHRzIDwtIGxhcHBseSh1bmlxdWUocm5hc2VxJG1ldGEkVHJlYXRtZW50LmFybSksZnVuY3Rpb24odGEpewogIHJuYXNlcS5zdWJzZXQgPC0gc3Vic2V0LlBEWChybmFzZXEsIHJuYXNlcSRtZXRhWyxUcmVhdG1lbnQuYXJtID09IHRhXSkKICBwY2EgPC0gcGNhLnJ1bihybmFzZXEuc3Vic2V0JGh1bWFuKQogIHBjYSA8LSBjYmluZChybmFzZXEuc3Vic2V0JG1ldGEscGNhKQogIGdncGFpcnMocGNhLCBjb2x1bW5zPWMoJ1BDMScsICdQQzInLCAnUEMzJywgImh1bWFuLmxpYnJhcnkuc2l6ZSIpLG1hcHBpbmc9YWVzKGNvbD1Hcm91cCksIHVwcGVyPWxpc3QoY29udGludW91cz0nY29yJyksdGl0bGUgPSBwYXN0ZSgiVHJlYXRtZW50IGFybToiLHRhKSkKfSkKZm9yKHAgaW4gcGx0cykgcHJpbnQocCwgcHJvZ3Jlc3MgPSBGKQpgYGAKCiMgfiBUcmVhdG1lbnQKCiMjIEdyb3VwIDEKCmBgYHtyfQpybmFzZXEuc3Vic2V0IDwtIHN1YnNldC5QRFgocm5hc2VxLCBybmFzZXEkbWV0YVssR3JvdXAgPT0gMV0pCiNybmFzZXEuc3Vic2V0IDwtIHN1YnNldC5QRFgocm5hc2VxLnN1YnNldCwgcm5hc2VxLnN1YnNldCRtZXRhWyxTYW1wbGUubmFtZSE9IkhDSTAxMS1UMS1QMDEtMTguOTQxM1IxLVQxIl0pCnRyZWF0bWVudCA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZhY3RvcihUcmVhdG1lbnQuYXJtLGxldmVscz1jKCJ2ZWhpY2xlIiwiR0RDMDAzMiIpKV0KCmQgPC0gbW9kZWwubWF0cml4KH4gMCArIHRyZWF0bWVudCkKZAoKY29udC5tYXRyaXggPC0gbWF0cml4KGMoLTEsMSksIGRpbShkKVsyXSwgMSkKY29sbmFtZXMoY29udC5tYXRyaXgpIDwtIGMoIkdEQy5taW51cy5jb250cm9sIikKcm93bmFtZXMoY29udC5tYXRyaXgpIDwtIGNvbG5hbWVzKGQpCmNvbnQubWF0cml4CgojUGVyZm9ybSBERQpERS5kYXRhIDwtIERFLnJ1bihybmFzZXEuc3Vic2V0JGh1bWFuLGQsY29udC5tYXRyaXggPSBjb250Lm1hdHJpeCkKCiNUb3AgREUgZ2VuZXMgdGFibGUKREUgPC0gdG9wVGFibGUuYW5ub3RhdGVkLkRFKERFLmRhdGEkZWZpdCxwLnZhbCA9IDEpCmlmKG5yb3coREVbYWRqLlAuVmFsPDAuMDVdKSE9MCl7CiAgREUgPC0gREVbYWRqLlAuVmFsPDAuMDVdCiAgdGFibGUoREVbLGRpcmVjdGlvbl0pCiAgREVbZGlyZWN0aW9uPT0idXAucmVnIiwuKGRpcmVjdGlvbixFTlNFTUJMLFNZTUJPTCxhZGouUC5WYWwsbG9nRkMpXQogIERFW2RpcmVjdGlvbj09ImRvd24ucmVnIiwuKGRpcmVjdGlvbixFTlNFTUJMLFNZTUJPTCxhZGouUC5WYWwsbG9nRkMpXQoKI1BoZWF0bWFwIHcvIGJhdGNoIGNvcnJlY3Rpb24KICBpIDwtIG1hdGNoKERFJEVOU0VNQkwscm93bmFtZXMoREUuZGF0YSR2JEUpKQogIHkgPC0gcmVtb3ZlQmF0Y2hFZmZlY3QoREUuZGF0YSR2JEVbaSxdLGRlc2lnbiA9IG1vZGVsLm1hdHJpeCh+ZHJ1ZyksIGJhdGNoPSBwZHgpCiAgbGFiZWxzLmNvbCA8LSByZXAoIiIsbnJvdyhybmFzZXEkbWV0YSkpCiAgbGFiZWxzLnJvdyA8LSBERSRTWU1CT0wKICBhbm4uY29sIDwtIGFzLmRhdGEuZnJhbWUocm5hc2VxJG1ldGFbLC4ocGR4LGRydWcpXSkKICByb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEkbWV0YVssU2FtcGxlLm5hbWVdCiAgcGhlYXRtYXAoeSxsYWJlbHNfY29sPWxhYmVscy5jb2wsbGFiZWxzX3Jvdz1sYWJlbHMucm93LGFubm90YXRpb25fY29sID0gYW5uLmNvbCxzY2FsZT0icm93IikKfSBlbHNlIHsKICBoZWFkKERFLDEwKQp9CgojR2VuZXMgb2YgSW50ZXJlc3QKeCA8LSBERS5kYXRhJHYkRVttYXRjaChHb0kkRU5TRU1CTCxyb3duYW1lcyhERS5kYXRhJHYkRSkpLF0Kcm93bmFtZXMoeCkgPC0gR29JJFNZTUJPTAoKIyMgQm94cGxvdAp5IDwtIG1lbHQoeCkKbmFtZXMoeSkgPC0gYygiU1lNQk9MIiwiZm5hbWUiLCJFeHByZXNzaW9uIikKeSA8LSBtZXJnZSh5LHJuYXNlcS5zdWJzZXQkbWV0YSkKZ2dwbG90KHkpICsgYWVzKHg9U1lNQk9MLHk9RXhwcmVzc2lvbixjb2xvcj1UcmVhdG1lbnQuYXJtKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhsYWJlbD1wYXN0ZTAoInAuYWRqID0gIiwuLnAuYWRqLi4pKSxtZXRob2Q9InQudGVzdCIpICsgdGhlbWVfdHVmdGUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKIyMgSGVhdG1hcApsYWJlbHMuY29sIDwtIHJuYXNlcS5zdWJzZXQkbWV0YVssQmFyY29kZV0KbGFiZWxzLnJvdyA8LSBHb0kkU1lNQk9MCmFubi5jb2wgPC0gYXMuZGF0YS5mcmFtZShybmFzZXEuc3Vic2V0JG1ldGFbLC4oVHJlYXRtZW50LmFybSldKQpyb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZuYW1lXQpwaGVhdG1hcCh4LGxhYmVsc19jb2w9bGFiZWxzLmNvbCxsYWJlbHNfcm93PWxhYmVscy5yb3csYW5ub3RhdGlvbl9jb2wgPSBhbm4uY29sLHNjYWxlPSJyb3ciKQoKI0dTRUEKCiMjIEM2CmdzZWEgPC0gR1NFQS5ydW4oREUuZGF0YSR2LGQsY29udC5tYXRyaXhbLDFdLEhzLmM2LDAuMDUpCmdzZWFbRGlyZWN0aW9uPT0iVXAiLC4ocm4sTkdlbmVzLERpcmVjdGlvbixGRFIpXQpnc2VhW0RpcmVjdGlvbj09IkRvd24iLC4ocm4sTkdlbmVzLERpcmVjdGlvbixGRFIpXQpgYGAKCiMjIEdyb3VwIDIKCmBgYHtyfQpybmFzZXEuc3Vic2V0IDwtIHN1YnNldC5QRFgocm5hc2VxLCBybmFzZXEkbWV0YVssR3JvdXAgPT0gMl0pCnRyZWF0bWVudCA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZhY3RvcihUcmVhdG1lbnQuYXJtLGxldmVscz1jKCJ2ZWhpY2xlIiwiR0RDMDAzMiIpKV0KCmQgPC0gbW9kZWwubWF0cml4KH4gMCArIHRyZWF0bWVudCkKZAoKY29udC5tYXRyaXggPC0gbWF0cml4KGMoLTEsMSksIGRpbShkKVsyXSwgMSkKY29sbmFtZXMoY29udC5tYXRyaXgpIDwtIGMoIkdEQy5taW51cy5jb250cm9sIikKcm93bmFtZXMoY29udC5tYXRyaXgpIDwtIGNvbG5hbWVzKGQpCmNvbnQubWF0cml4CgojUGVyZm9ybSBERQpERS5kYXRhIDwtIERFLnJ1bihybmFzZXEuc3Vic2V0JGh1bWFuLGQsMyxjb250Lm1hdHJpeCA9IGNvbnQubWF0cml4KQoKI1RvcCBERSBnZW5lcyB0YWJsZQpERSA8LSB0b3BUYWJsZS5hbm5vdGF0ZWQuREUoREUuZGF0YSRlZml0LHAudmFsID0gMSkKaWYobnJvdyhERVthZGouUC5WYWw8MC4wNV0pIT0wKXsKICBERSA8LSBERVthZGouUC5WYWw8MC4wNV0KICB0YWJsZShERVssZGlyZWN0aW9uXSkKICBERVtkaXJlY3Rpb249PSJ1cC5yZWciLC4oZGlyZWN0aW9uLEVOU0VNQkwsU1lNQk9MLGFkai5QLlZhbCxsb2dGQyldCiAgREVbZGlyZWN0aW9uPT0iZG93bi5yZWciLC4oZGlyZWN0aW9uLEVOU0VNQkwsU1lNQk9MLGFkai5QLlZhbCxsb2dGQyldCgojUGhlYXRtYXAgdy8gYmF0Y2ggY29ycmVjdGlvbgogIGkgPC0gbWF0Y2goREUkRU5TRU1CTCxyb3duYW1lcyhERS5kYXRhJHYkRSkpCiAgeSA8LSByZW1vdmVCYXRjaEVmZmVjdChERS5kYXRhJHYkRVtpLF0sZGVzaWduID0gbW9kZWwubWF0cml4KH5kcnVnKSwgYmF0Y2g9IHBkeCkKICBsYWJlbHMuY29sIDwtIHJlcCgiIixucm93KHJuYXNlcSRtZXRhKSkKICBsYWJlbHMucm93IDwtIERFJFNZTUJPTAogIGFubi5jb2wgPC0gYXMuZGF0YS5mcmFtZShybmFzZXEkbWV0YVssLihwZHgsZHJ1ZyldKQogIHJvd25hbWVzKGFubi5jb2wpIDwtIHJuYXNlcSRtZXRhWyxTYW1wbGUubmFtZV0KICBwaGVhdG1hcCh5LGxhYmVsc19jb2w9bGFiZWxzLmNvbCxsYWJlbHNfcm93PWxhYmVscy5yb3csYW5ub3RhdGlvbl9jb2wgPSBhbm4uY29sLHNjYWxlPSJyb3ciKQp9IGVsc2UgewogIHByaW50KCJObyBERSBnZW5lcyBmb3VuZCIpCiAgaGVhZChERSwxMCkKfQoKI0dlbmVzIG9mIEludGVyZXN0CnggPC0gREUuZGF0YSR2JEVbbWF0Y2goR29JJEVOU0VNQkwscm93bmFtZXMoREUuZGF0YSR2JEUpKSxdCnJvd25hbWVzKHgpIDwtIEdvSSRTWU1CT0wKCiMjIEJveHBsb3QKeSA8LSBtZWx0KHgpCm5hbWVzKHkpIDwtIGMoIlNZTUJPTCIsImZuYW1lIiwiRXhwcmVzc2lvbiIpCnkgPC0gbWVyZ2UoeSxybmFzZXEuc3Vic2V0JG1ldGEpCmdncGxvdCh5KSArIGFlcyh4PVNZTUJPTCx5PUV4cHJlc3Npb24sY29sb3I9VHJlYXRtZW50LmFybSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfY29tcGFyZV9tZWFucyhhZXMobGFiZWw9cGFzdGUwKCJwLmFkaiA9ICIsLi5wLmFkai4uKSksbWV0aG9kPSJ0LnRlc3QiKSArIHRoZW1lX3R1ZnRlKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCiMjIEhlYXRtYXAKbGFiZWxzLmNvbCA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLEJhcmNvZGVdCmxhYmVscy5yb3cgPC0gR29JJFNZTUJPTAphbm4uY29sIDwtIGFzLmRhdGEuZnJhbWUocm5hc2VxLnN1YnNldCRtZXRhWywuKFRyZWF0bWVudC5hcm0pXSkKcm93bmFtZXMoYW5uLmNvbCkgPC0gcm5hc2VxLnN1YnNldCRtZXRhWyxmbmFtZV0KcGhlYXRtYXAoeCxsYWJlbHNfY29sPWxhYmVscy5jb2wsbGFiZWxzX3Jvdz1sYWJlbHMucm93LGFubm90YXRpb25fY29sID0gYW5uLmNvbCxzY2FsZT0icm93IikKCiNHU0VBIC0gYzYKZ3NlYSA8LSBHU0VBLnJ1bihERS5kYXRhJHYsZCxjb250Lm1hdHJpeFssMV0sSHMuYzYsMC4wNSkKZ3NlYVtEaXJlY3Rpb249PSJVcCIsLihybixOR2VuZXMsRGlyZWN0aW9uLEZEUildCmdzZWFbRGlyZWN0aW9uPT0iRG93biIsLihybixOR2VuZXMsRGlyZWN0aW9uLEZEUildCmBgYAoKIyMgR3JvdXAgMwoKYGBge3J9CnJuYXNlcS5zdWJzZXQgPC0gc3Vic2V0LlBEWChybmFzZXEsIHJuYXNlcSRtZXRhWyxHcm91cCA9PSAzXSkKdHJlYXRtZW50IDwtIHJuYXNlcS5zdWJzZXQkbWV0YVssZmFjdG9yKFRyZWF0bWVudC5hcm0sbGV2ZWxzPWMoInZlaGljbGUiLCJHREMwMDMyIikpXQoKZCA8LSBtb2RlbC5tYXRyaXgofiAwICsgdHJlYXRtZW50KQpkCgpjb250Lm1hdHJpeCA8LSBtYXRyaXgoYygtMSwxKSwgZGltKGQpWzJdLCAxKQpjb2xuYW1lcyhjb250Lm1hdHJpeCkgPC0gYygiR0RDLm1pbnVzLmNvbnRyb2wiKQpyb3duYW1lcyhjb250Lm1hdHJpeCkgPC0gY29sbmFtZXMoZCkKY29udC5tYXRyaXgKCiNQZXJmb3JtIERFCkRFLmRhdGEgPC0gREUucnVuKHJuYXNlcS5zdWJzZXQkaHVtYW4sZCw1LGNvbnQubWF0cml4ID0gY29udC5tYXRyaXgpCgojVG9wIERFIGdlbmVzIHRhYmxlCkRFIDwtIHRvcFRhYmxlLmFubm90YXRlZC5ERShERS5kYXRhJGVmaXQscC52YWwgPSAxKQppZihucm93KERFW2Fkai5QLlZhbDwwLjA1XSkhPTApewogIERFIDwtIERFW2Fkai5QLlZhbDwwLjA1XQogIHRhYmxlKERFWyxkaXJlY3Rpb25dKQogIERFW2RpcmVjdGlvbj09InVwLnJlZyIsLihkaXJlY3Rpb24sRU5TRU1CTCxTWU1CT0wsYWRqLlAuVmFsLGxvZ0ZDKV0KICBERVtkaXJlY3Rpb249PSJkb3duLnJlZyIsLihkaXJlY3Rpb24sRU5TRU1CTCxTWU1CT0wsYWRqLlAuVmFsLGxvZ0ZDKV0KCiNQaGVhdG1hcCB3LyBiYXRjaCBjb3JyZWN0aW9uCiAgaSA8LSBtYXRjaChERSRFTlNFTUJMLHJvd25hbWVzKERFLmRhdGEkdiRFKSkKICB5IDwtIHJlbW92ZUJhdGNoRWZmZWN0KERFLmRhdGEkdiRFW2ksXSxkZXNpZ24gPSBtb2RlbC5tYXRyaXgofmRydWcpLCBiYXRjaD0gcGR4KQogIGxhYmVscy5jb2wgPC0gcmVwKCIiLG5yb3cocm5hc2VxJG1ldGEpKQogIGxhYmVscy5yb3cgPC0gREUkU1lNQk9MCiAgYW5uLmNvbCA8LSBhcy5kYXRhLmZyYW1lKHJuYXNlcSRtZXRhWywuKHBkeCxkcnVnKV0pCiAgcm93bmFtZXMoYW5uLmNvbCkgPC0gcm5hc2VxJG1ldGFbLFNhbXBsZS5uYW1lXQogIHBoZWF0bWFwKHksbGFiZWxzX2NvbD1sYWJlbHMuY29sLGxhYmVsc19yb3c9bGFiZWxzLnJvdyxhbm5vdGF0aW9uX2NvbCA9IGFubi5jb2wsc2NhbGU9InJvdyIpCn0gZWxzZSB7CiAgcHJpbnQoIk5vIERFIGdlbmVzIGZvdW5kIikKICBoZWFkKERFLDEwKQp9CgojR2VuZXMgb2YgSW50ZXJlc3QKeCA8LSBERS5kYXRhJHYkRVttYXRjaChHb0kkRU5TRU1CTCxyb3duYW1lcyhERS5kYXRhJHYkRSkpLF0Kcm93bmFtZXMoeCkgPC0gR29JJFNZTUJPTAoKIyMgQm94cGxvdAp5IDwtIG1lbHQoeCkKbmFtZXMoeSkgPC0gYygiU1lNQk9MIiwiZm5hbWUiLCJFeHByZXNzaW9uIikKeSA8LSBtZXJnZSh5LHJuYXNlcS5zdWJzZXQkbWV0YSkKZ2dwbG90KHkpICsgYWVzKHg9U1lNQk9MLHk9RXhwcmVzc2lvbixjb2xvcj1UcmVhdG1lbnQuYXJtKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhsYWJlbD1wYXN0ZTAoInAuYWRqID0gIiwuLnAuYWRqLi4pKSxtZXRob2Q9InQudGVzdCIpICsgdGhlbWVfdHVmdGUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKIyMgSGVhdG1hcApsYWJlbHMuY29sIDwtIHJuYXNlcS5zdWJzZXQkbWV0YVssQmFyY29kZV0KbGFiZWxzLnJvdyA8LSBHb0kkU1lNQk9MCmFubi5jb2wgPC0gYXMuZGF0YS5mcmFtZShybmFzZXEuc3Vic2V0JG1ldGFbLC4oVHJlYXRtZW50LmFybSldKQpyb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZuYW1lXQpwaGVhdG1hcCh4LGxhYmVsc19jb2w9bGFiZWxzLmNvbCxsYWJlbHNfcm93PWxhYmVscy5yb3csYW5ub3RhdGlvbl9jb2wgPSBhbm4uY29sLHNjYWxlPSJyb3ciKQoKI0dTRUEgLSBjNgpnc2VhIDwtIEdTRUEucnVuKERFLmRhdGEkdixkLGNvbnQubWF0cml4WywxXSxIcy5jNiwwLjA1KQpnc2VhW0RpcmVjdGlvbj09IlVwIiwuKHJuLE5HZW5lcyxEaXJlY3Rpb24sRkRSKV0KZ3NlYVtEaXJlY3Rpb249PSJEb3duIiwuKHJuLE5HZW5lcyxEaXJlY3Rpb24sRkRSKV0KYGBgCgojIH4gR3JvdXAgCgojIyBWZWhpY2xlCgpgYGB7cn0Kcm5hc2VxLnN1YnNldCA8LSBzdWJzZXQuUERYKHJuYXNlcSwgcm5hc2VxJG1ldGFbLFRyZWF0bWVudC5hcm09PSJ2ZWhpY2xlIl0pCnRyZWF0bWVudC5ncm91cCA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLEdyb3VwXQoKZCA8LSBtb2RlbC5tYXRyaXgofiAwICsgdHJlYXRtZW50Lmdyb3VwKQpkCgpjb250Lm1hdHJpeCA8LSBtYXRyaXgoYygtMSwxLDAsLTEsMCwxLDAsLTEsMSksIGRpbShkKVsyXSwgMykKY29sbmFtZXMoY29udC5tYXRyaXgpIDwtIGMoIkxvbmcubWludXMuc2hvcnQiLCJSZXNpc3RhbnQubWludXMuc2hvcnQiLCJSZXNpc3RhbnQubWludXMubG9uZyIpCnJvd25hbWVzKGNvbnQubWF0cml4KSA8LSBjb2xuYW1lcyhkKQpjb250Lm1hdHJpeAoKI1BlcmZvcm0gREUKREUuZGF0YSA8LSBERS5ydW4ocm5hc2VxLnN1YnNldCRodW1hbixkLDMsY29udC5tYXRyaXggPSBjb250Lm1hdHJpeCkKCmR0IDwtIGRlY2lkZVRlc3RzKERFLmRhdGEkZWZpdCkKc3VtbWFyeShkdCkKCmR0LmNvbW1vbiA8LSBkdFtyb3dTdW1zKGFicyhkdCkpIT0wLF0KdmVubkRpYWdyYW0oZHQuY29tbW9uKQoKI0dlbmVzIG9mIEludGVyZXN0CnggPC0gREUuZGF0YSR2JEVbbWF0Y2goR29JJEVOU0VNQkwscm93bmFtZXMoREUuZGF0YSR2JEUpKSxdCnJvd25hbWVzKHgpIDwtIEdvSSRTWU1CT0wKCiMjIEJveHBsb3QKeSA8LSBtZWx0KHgpCm5hbWVzKHkpIDwtIGMoIlNZTUJPTCIsImZuYW1lIiwiRXhwcmVzc2lvbiIpCnkgPC0gbWVyZ2UoeSxybmFzZXEuc3Vic2V0JG1ldGEpCmdncGxvdCh5KSArIGFlcyh4PVNZTUJPTCx5PUV4cHJlc3Npb24sY29sb3I9R3JvdXApICsgZ2VvbV9ib3hwbG90KCkgKyB0aGVtZV90dWZ0ZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgojIyBIZWF0bWFwCmxhYmVscy5jb2wgPC0gcm5hc2VxLnN1YnNldCRtZXRhWyxCYXJjb2RlXQpsYWJlbHMucm93IDwtIEdvSSRTWU1CT0wKYW5uLmNvbCA8LSBhcy5kYXRhLmZyYW1lKHJuYXNlcS5zdWJzZXQkbWV0YVssLihHcm91cCldKQpyb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZuYW1lXQpwaGVhdG1hcCh4LGxhYmVsc19jb2w9bGFiZWxzLmNvbCxsYWJlbHNfcm93PWxhYmVscy5yb3csYW5ub3RhdGlvbl9jb2wgPSBhbm4uY29sLHNjYWxlPSJyb3ciKQpgYGAKCgojIyBEcnVnCgpgYGB7cn0Kcm5hc2VxLnN1YnNldCA8LSBzdWJzZXQuUERYKHJuYXNlcSwgcm5hc2VxJG1ldGFbLFRyZWF0bWVudC5hcm09PSJHREMwMDMyIl0pCnRyZWF0bWVudC5ncm91cCA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLEdyb3VwXQoKZCA8LSBtb2RlbC5tYXRyaXgofiAwICsgdHJlYXRtZW50Lmdyb3VwKQpkCgpjb250Lm1hdHJpeCA8LSBtYXRyaXgoYygtMSwxLDAsLTEsMCwxLDAsLTEsMSksIGRpbShkKVsyXSwgMykKY29sbmFtZXMoY29udC5tYXRyaXgpIDwtIGMoIkxvbmcubWludXMuc2hvcnQiLCJSZXNpc3RhbnQubWludXMuc2hvcnQiLCJSZXNpc3RhbnQubWludXMubG9uZyIpCnJvd25hbWVzKGNvbnQubWF0cml4KSA8LSBjb2xuYW1lcyhkKQpjb250Lm1hdHJpeAoKI1BlcmZvcm0gREUKREUuZGF0YSA8LSBERS5ydW4ocm5hc2VxLnN1YnNldCRodW1hbixkLDQsY29udC5tYXRyaXggPSBjb250Lm1hdHJpeCkKCmR0IDwtIGRlY2lkZVRlc3RzKERFLmRhdGEkZWZpdCkKc3VtbWFyeShkdCkKCmR0LmNvbW1vbiA8LSBkdFtyb3dTdW1zKGFicyhkdCkpIT0wLF0KdmVubkRpYWdyYW0oZHQuY29tbW9uKQoKI0dlbmVzIG9mIEludGVyZXN0CnggPC0gREUuZGF0YSR2JEVbbWF0Y2goR29JJEVOU0VNQkwscm93bmFtZXMoREUuZGF0YSR2JEUpKSxdCnJvd25hbWVzKHgpIDwtIEdvSSRTWU1CT0wKCiMjIEJveHBsb3QKeSA8LSBtZWx0KHgpCm5hbWVzKHkpIDwtIGMoIlNZTUJPTCIsImZuYW1lIiwiRXhwcmVzc2lvbiIpCnkgPC0gbWVyZ2UoeSxybmFzZXEuc3Vic2V0JG1ldGEpCmdncGxvdCh5KSArIGFlcyh4PVNZTUJPTCx5PUV4cHJlc3Npb24sY29sb3I9R3JvdXApICsgZ2VvbV9ib3hwbG90KCkgKyB0aGVtZV90dWZ0ZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgojIyBIZWF0bWFwCmxhYmVscy5jb2wgPC0gcm5hc2VxLnN1YnNldCRtZXRhWyxCYXJjb2RlXQpsYWJlbHMucm93IDwtIEdvSSRTWU1CT0wKYW5uLmNvbCA8LSBhcy5kYXRhLmZyYW1lKHJuYXNlcS5zdWJzZXQkbWV0YVssLihHcm91cCldKQpyb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEuc3Vic2V0JG1ldGFbLGZuYW1lXQpwaGVhdG1hcCh4LGxhYmVsc19jb2w9bGFiZWxzLmNvbCxsYWJlbHNfcm93PWxhYmVscy5yb3csYW5ub3RhdGlvbl9jb2wgPSBhbm4uY29sLHNjYWxlPSJyb3ciKQpgYGAKCiMgfiBUcmVhdG1lbnQgKiBHcm91cAoKYGBge3J9CnRyZWF0bWVudC5ncm91cCA8LSBybmFzZXEkbWV0YVssR3JvdXBdCnRyZWF0bWVudCA8LSBybmFzZXEkbWV0YVssZmFjdG9yKFRyZWF0bWVudC5hcm0sbGV2ZWxzPWMoInZlaGljbGUiLCJHREMwMDMyIikpXQoKZCA8LSBtb2RlbC5tYXRyaXgofiAwICsgdHJlYXRtZW50Lmdyb3VwICogdHJlYXRtZW50KQpkCgpERS5kYXRhIDwtIERFLnJ1bihybmFzZXEkaHVtYW4sZCxjb2VmcyA9IDE6NikKCmR0IDwtIGRlY2lkZVRlc3RzKERFLmRhdGEkZWZpdCkKc3VtbWFyeShkdCkKCiNHZW5lcyBvZiBJbnRlcmVzdAp4IDwtIERFLmRhdGEkdiRFW21hdGNoKEdvSSRFTlNFTUJMLHJvd25hbWVzKERFLmRhdGEkdiRFKSksXQpyb3duYW1lcyh4KSA8LSBHb0kkU1lNQk9MCgojIyBCb3hwbG90CnkgPC0gbWVsdCh4KQpuYW1lcyh5KSA8LSBjKCJTWU1CT0wiLCJmbmFtZSIsIkV4cHJlc3Npb24iKQp5IDwtIGRhdGEudGFibGUobWVyZ2UoeSxybmFzZXEkbWV0YSkpCnlbLFRyZWF0bWVudC5hcm06PWZhY3RvcihUcmVhdG1lbnQuYXJtLGxldmVscz1jKCJ2ZWhpY2xlIiwiR0RDMDAzMiIpKV0KbGV2ZWxzKHkkVHJlYXRtZW50LmFybSkgPC0gYygiVmVoaWNsZSIsIkdEQzAwMzIiKQpnZ3Bsb3QoeSkgKyBhZXMoeD1UcmVhdG1lbnQuYXJtLHk9RXhwcmVzc2lvbixjb2xvcj1Hcm91cCkgKyBnZW9tX2JveHBsb3QoKSArIHRoZW1lX3R1ZnRlKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKyBmYWNldF93cmFwKH5TWU1CT0wpCmdncGxvdCh5KSArIGFlcyh4PUdyb3VwLHk9RXhwcmVzc2lvbixjb2xvcj1UcmVhdG1lbnQuYXJtKSArIGdlb21fYm94cGxvdCgpICsgdGhlbWVfdHVmdGUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIGZhY2V0X3dyYXAoflNZTUJPTCkKCiMjIEhlYXRtYXAKbGFiZWxzLmNvbCA8LSBybmFzZXEkbWV0YVssQmFyY29kZV0KbGFiZWxzLnJvdyA8LSBHb0kkU1lNQk9MCmFubi5jb2wgPC0gYXMuZGF0YS5mcmFtZShybmFzZXEkbWV0YVssLihHcm91cCxUcmVhdG1lbnQuYXJtKV0pCnJvd25hbWVzKGFubi5jb2wpIDwtIHJuYXNlcSRtZXRhWyxmbmFtZV0KcGhlYXRtYXAoeCxsYWJlbHNfY29sPWxhYmVscy5jb2wsbGFiZWxzX3Jvdz1sYWJlbHMucm93LGFubm90YXRpb25fY29sID0gYW5uLmNvbCxzY2FsZT0ibm9uZSIpCgojIFBhdGh3YXlzIG9mIEludGVyZXN0CnBsdHMgPC0gbGFwcGx5KFBvSSwgZnVuY3Rpb24ocCl7CiAgeCA8LSBERS5kYXRhJHYkRVttYXRjaChwJEVOU0VNQkwscm93bmFtZXMoREUuZGF0YSR2JEUpKSxdCiAgcm93bmFtZXMoeCkgPC0gcCRTWU1CT0wKICB4IDwtIHhbcm93U3Vtcyhpcy5uYSh4KSkgPT0gMCxdCiAgbGFiZWxzLmNvbCA8LSBybmFzZXEkbWV0YVssQmFyY29kZV0KICBsYWJlbHMucm93IDwtIHJvd25hbWVzKHgpCiAgYW5uLmNvbCA8LSBhcy5kYXRhLmZyYW1lKHJuYXNlcSRtZXRhWywuKEdyb3VwLFRyZWF0bWVudC5hcm0pXSkKICByb3duYW1lcyhhbm4uY29sKSA8LSBybmFzZXEkbWV0YVssZm5hbWVdCiAgcGhlYXRtYXAoeCxsYWJlbHNfY29sPWxhYmVscy5jb2wsbGFiZWxzX3Jvdz1sYWJlbHMucm93LGFubm90YXRpb25fY29sID0gYW5uLmNvbCxzY2FsZT0ibm9uZSIpCn0pCmBgYAoKYGBge3J9CmdncGxvdCh5W3kkU1lNQk9MPT0iTERIQSIsXSkgKyBhZXMoeD1Hcm91cCx5PUV4cHJlc3Npb24sZmlsbD1UcmVhdG1lbnQuYXJtKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsbWV0aG9kPSJ0LnRlc3QiLG1ldGhvZC5hcmdzID0gbGlzdChhbHRlcm5hdGl2ZSA9ICJsZXNzIiksbGFiZWwueT05LjcpICsgdGhlbWVfdHVmdGUoMTIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKyB5bGFiKCJMREhBIEV4cHJlc3Npb24iKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoeVt5JFNZTUJPTD09IkZPWE0xIixdKSArIGFlcyh4PUdyb3VwLHk9RXhwcmVzc2lvbixmaWxsPVRyZWF0bWVudC5hcm0pICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWw9InAuZm9ybWF0IixtZXRob2Q9InQudGVzdCIsbWV0aG9kLmFyZ3MgPSBsaXN0KGFsdGVybmF0aXZlID0gImxlc3MiKSxsYWJlbC55PTkuNykgKyB0aGVtZV90dWZ0ZSgxMikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIixsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArIHlsYWIoIkZPWE0xIEV4cHJlc3Npb24iKQpgYGAKCgpgYGB7cn0KbXlfY29tcGFyaXNvbnMgPC0gbGlzdChjKCIxIiwiMiIpLGMoIjIiLCIzIiksYygiMSIsIjMiKSkKZ2dwbG90KHlbeSRTWU1CT0w9PSJGT1hNMSIgJiBUcmVhdG1lbnQuYXJtPT0iR0RDMDAzMiIsXSkgKyBhZXMoeD1Hcm91cCx5PUV4cHJlc3Npb24pICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwueT04LjUpICsgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsbWV0aG9kLmFyZ3MgPSBsaXN0KGFsdGVybmF0aXZlID0gImxlc3MiKSkgKyB0aGVtZV90dWZ0ZSgxMikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKyB5bGFiKCJGT1hNMSBFeHByZXNzaW9uIikgKyB4bGFiKCJHREMtMDAzMiBUcmVhdGVkIEdyb3VwIikKYGBgCgpgYGB7cn0KZ2dwbG90KHlbR3JvdXAlaW4lMSB8IChHcm91cD09MyAmIFRyZWF0bWVudC5hcm09PSJHREMwMDMyIildKSArIGFlcyh4PWludGVyYWN0aW9uKFRyZWF0bWVudC5hcm0sR3JvdXApLHk9RXhwcmVzc2lvbixjb2xvcj1Hcm91cCkgKyBnZW9tX2JveHBsb3QoKSArIHRoZW1lX3R1ZnRlKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKyBmYWNldF93cmFwKH5TWU1CT0wpCmBgYAoKYGBge1J9CnogPC0gbWVyZ2UoZGF0YS50YWJsZSh0KHgpLGtlZXAucm93bmFtZXMgPSAiZm5hbWUiKSxybmFzZXEkbWV0YSkKZ2dwYWlycyh6LGNvbHVtbnMgPSAyOjYpCmBgYA==